function assert(assertion) {
  // From: http://phpjs.org/functions
  // +   original by: Brett Zamir (http://brett-zamir.me)
  // %        note 1: Do not pass untrusted user input to assert() in string form (you can test it beforehand though)
  // %        note 2: Does not provide perfect arguments to the assertion callback, as far as file location or line number
  // *     example 1: assert('false === true');
  // *     returns 1: false

  var result = false,
      callback, retVal, err = undefined;

  // BEGIN REDUNDANT
  this.php_js = this.php_js || {};
  this.php_js.ini = this.php_js.ini || {};
  this.php_js.assert_values = this.php_js.assert_values || {};
  // END REDUNDANT

  var getOption = function(value) {
    if (this.php_js.assert_values[value]) {
      return this.php_js.assert_values[value];
    }
    if (this.php_js.ini[value]) {
      return this.php_js.ini[value].local_value;
    }
    switch (value) {
      case 'assert.active':
        return 1;
      case 'assert.warning':
        // Don't need this now
        //return 1;
        throw 'We have not yet implemented warnings in JavaScript (assert())';
      case 'assert.bail':
        return 0;
      case 'assert.quiet_eval':
        return 0;
      case 'assert.callback':
        return null;
      default:
        throw 'There was some problem';
    }
  };

  if (!getOption('assert.active')) {
    return false; // is this correct? should callbacks still execute? Should still bail if on?
  }

  try { // Less overhead to use string when assertion checking is off, allows message of exact code to callback
    result = typeof assertion === 'string' ? eval(assertion) : assertion;
  } catch (e) {
    if (!getOption('assert.quiet_eval')) {
      throw e;
    }
    err = e;
    result = false;
  }
  retVal = result !== false; // return false if false, otherwise, return true
  if (retVal === false) {
    if (getOption('assert.bail')) { // Todo: Will the function bail before a callback or after?
      throw 'Assertion bailed'; // No way to bail without throwing an exception (and there are no "warnings" in JavaScript for us to throw)
    }
    callback = getOption('assert.callback');
    if (typeof callback === 'string') {
      callback = this.window[callback];
    }
    // Not perfect for file location (might also use __FILE__()) or line number
    callback(this.window.location.href, err && err.lineNumber, (typeof assertion === 'string' ? assertion : '')); // From the docs, what does this mean?: "the third argument will contain the expression that failed (if any - literal values such as 1 or "two" will not be passed via this argument)"
  }
  return retVal;
}
